home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-01-13 | 3.8 KB | 157 lines | [TEXT/CWIE] |
- /*
- File: DynamicArray.cp
-
- Contains: A handle-based dynamic array class
-
- Written by: Dave Falkenburg
-
- Copyright: © 1994-95 by Dave Falkenburg, all rights reserved.
-
- Change History (most recent first):
-
- <1> 1/3/95 DRF First checked in.
- */
-
- #include "DynamicArray.h"
- #include <Memory.h>
-
-
- //--------------------------------------------------------------------------------
- TDynamicArray::TDynamicArray()
- {
- fElementCount = 0;
- fStorage = (ArrayElementPtr **) NewHandle(0);
- }
-
-
- //--------------------------------------------------------------------------------
- TDynamicArray::~TDynamicArray()
- {
- DisposeHandle((Handle) fStorage);
- }
-
-
- //--------------------------------------------------------------------------------
- OSErr TDynamicArray::Insert(ArrayElement * elementToInsert, ArrayElementIndex beforeElement)
- {
- OSErr err;
-
- // make room for one more ArrayElementPtr
- SetHandleSize((Handle) fStorage, (fElementCount + 1) * sizeof(ArrayElementPtr));
- if ((err = MemError()) != noErr)
- return err;
-
- if(fElementCount){
- // slide remaining elements down
- BlockMoveData( &((*fStorage)[beforeElement]),
- &((*fStorage)[beforeElement+1]),
- (fElementCount - beforeElement) * sizeof(ArrayElementPtr));
- }
-
- fElementCount++;
- (*fStorage)[beforeElement] = elementToInsert;
-
- return noErr;
- }
-
-
- //--------------------------------------------------------------------------------
- OSErr TDynamicArray::InsertFirst(ArrayElement * elementToInsert)
- {
- return this->Insert(elementToInsert,0);
- }
-
-
- //--------------------------------------------------------------------------------
- OSErr TDynamicArray::InsertLast(ArrayElement * elementToInsert)
- {
- return this->Insert(elementToInsert,fElementCount);
- }
-
-
- //--------------------------------------------------------------------------------
- void TDynamicArray::Delete(ArrayElementIndex whichElement)
- {
- // slide remaining elements up
- BlockMoveData( &((*fStorage)[whichElement+1]),
- &((*fStorage)[whichElement]),
- (fElementCount - whichElement) * sizeof(ArrayElementPtr));
-
- // cut back the storage
- fElementCount--;
- SetHandleSize((Handle) fStorage,fElementCount*sizeof(ArrayElementPtr));
- }
-
-
- //--------------------------------------------------------------------------------
- void TDynamicArray::DeleteFirst()
- {
- this->Delete(0);
- }
-
-
- //--------------------------------------------------------------------------------
- void TDynamicArray::DeleteLast()
- {
- this->Delete(fElementCount);
- }
-
-
- //--------------------------------------------------------------------------------
- ArrayElement * TDynamicArray::GetElementPtr(ArrayElementIndex whichElement)
- {
- return (*fStorage)[whichElement];
- }
-
-
- //--------------------------------------------------------------------------------
- void TDynamicArray::SetElementPtr(ArrayElementIndex whichElement, ArrayElementPtr element)
- {
- (*fStorage)[whichElement] = element;
- }
-
-
- //--------------------------------------------------------------------------------
- void TDynamicArray::ForEachElement(EachArrayElementProc proc, void * param)
- {
- ArrayElementIndex index = 0;
-
- while (index < fElementCount)
- {
- (*proc)((*fStorage)[index],param);
- index++;
- }
- }
-
-
- //--------------------------------------------------------------------------------
- ArrayElement * TDynamicArray::FirstElementThat(EachArrayElementTestProc proc, void * param)
- {
- ArrayElementIndex index = 0;
-
- while (index < fElementCount)
- {
- if ((*proc)((*fStorage)[index],param))
- return (*fStorage)[index];
- index++;
- }
-
- return NULL;
- }
-
-
- //--------------------------------------------------------------------------------
- ArrayElement * TDynamicArray::LastElementThat(EachArrayElementTestProc proc, void * param)
- {
- ArrayElementIndex index = fElementCount-1;
-
- while (index != -1)
- {
- if ((*proc)((*fStorage)[index],param))
- return (*fStorage)[index];
- index--;
- }
-
- return NULL;
- }
-